
namespace ShoppingCart.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
    using Microsoft.Practices.EnterpriseLibrary.Data;
	using ShoppingCart.Business.Entity;

	/// <summary>
	/// Represents the DataAccess of ProvinciaData.
	/// </summary>
	public class ProvinciaData : Singleton<ProvinciaData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

		/// <summary>
		/// Selects all records from the Provincia table by a foreign key.
		/// </summary>
		public Provincia Obtener(int idProvincia)
		{
			var provincia = default(Provincia);
			var comando = BaseDatos.GetStoredProcCommand("SelectProvincia");

			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, idProvincia);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    provincia = new Provincia
                    {
                        IdProvincia = lector.GetInt32(lector.GetOrdinal("IdProvincia")),
                        Departamento = DepartamentoData.Instancia.Obtener(lector.GetInt32(lector.GetOrdinal("IdDepartamento"))),
                        Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
                        Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
                    };
				}
			}
			comando.Dispose();
			return provincia;
		}

		/// <summary>
		/// Saves a record to the Provincia table.
		/// </summary>
		public int Agregar(Provincia provincia)
		{
			var comando = BaseDatos.GetStoredProcCommand("InsertProvincia");
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, provincia.IdProvincia);
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, provincia.Departamento.IdDepartamento);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, provincia.Nombre);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, provincia.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Agregar Provincia.");

			comando.Dispose();
			return 1;
		}

		/// <summary>
		/// Updates a record in the Provincia table.
		/// </summary>
		public bool Modificar(Provincia provincia)
		{
			var comando = BaseDatos.GetStoredProcCommand("UpdateProvincia");
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, provincia.IdProvincia);
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, provincia.Departamento.IdDepartamento);
			BaseDatos.AddInParameter(comando, "Nombre", DbType.String, provincia.Nombre);
			BaseDatos.AddInParameter(comando, "Estado", DbType.Boolean, provincia.Estado);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Modificar Provincia.");

			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Provincia table by its primary key.
		/// </summary>
		public bool Eliminar(int idProvincia)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProvincia");
			BaseDatos.AddInParameter(comando, "IdProvincia", DbType.Int32, idProvincia);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Provincia.");
			comando.Dispose();
			return true;
		}

		/// <summary>
		/// Deletes a record from the Provincia table by a foreign key.
		/// </summary>
		public void EliminarPorIdDepartamento(int idDepartamento)
		{
			var comando = BaseDatos.GetStoredProcCommand("DeleteProvinciaByIdDepartamento");
			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, idDepartamento);

			var resultado = BaseDatos.ExecuteNonQuery(comando);
			if (resultado == 0) throw new Exception("Error al Eliminar Provincia.");
			comando.Dispose();
		}

		/// <summary>
		/// Selects all records from the Provincia table by a foreign key.
		/// </summary>
		public IList<Provincia> ListarPorIdDepartamento(int idDepartamento)
		{
			var entidades = new List<Provincia>();
			var comando = BaseDatos.GetStoredProcCommand("SelectProvinciaByIdDepartamento");

			BaseDatos.AddInParameter(comando, "IdDepartamento", DbType.Int32, idDepartamento);

			using (var lector = BaseDatos.ExecuteReader(comando))
			{
				while (lector.Read())
				{
                    entidades.Add(new Provincia
                    {
                        Departamento = DepartamentoData.Instancia.Obtener(idDepartamento),
                        IdProvincia = lector.GetInt32(lector.GetOrdinal("IdProvincia")),
                        Nombre = lector.GetString(lector.GetOrdinal("Nombre")),
                        Estado = lector.GetBoolean(lector.GetOrdinal("Estado"))
                    });
				}
			}
			comando.Dispose();
			return entidades;
		}

		#endregion
	}
}
